import tkinter as tk
from tkinter import font
import random
import threading

class HeartGame:
    def __init__(self, send): #enable 表示是否可以出牌
        #main.py中的发送消息函数
        self.send = send
        # 新增：玩家 ID
        self.player_txt_ids = ['', '', '', '']
        # 新增：控制出牌状态的变量
        self.enable = False

        #窗口大小
        self.window_width = 800
        self.window_height = 600

        #游戏内数据
        self.current_turn = 0
        self.played_cards = [None, None, None, None]  # 分别对应下、右、上、左四个位置的出牌
        self.players_to_position = {} #记录client_id与玩家在牌桌上位置的对应关系
        self.position = 0 #记录自己在牌桌上的位置
        self.first_player = None #记录每一轮第一个出牌的玩家
        self.player_scores = [0, 0, 0, 0] #总分
        self.player_game_scores = [0, 0, 0 ,0] #每一小局的分数
        #玩家手牌
        self.hand =[]

    def initiation(self, root):
        # 创建玩家区域
        # 创建主窗口
        self.root = root
        self.root.title("红心大战")
        self.root.geometry(f"{self.window_width}x{self.window_height}")  # 设置固定窗口大小
        self.root.resizable(False, False)  # 禁止调整窗口大小
        '''# 显示四个玩家的 ID
        self.create_player_id_labels()'''
        
        # 中央出牌区域
        self.central_frame = tk.Frame(self.root)
        self.central_frame.pack(expand=True, fill=tk.BOTH)
        self.central_frame.grid_propagate(False)  # 禁止自动调整大小

        # 手牌区域
        self.bottom_frame = tk.Frame(self.root, height=150, bg='green') # 增大底部框架高度以容纳更多手牌
        self.bottom_frame.pack(side=tk.BOTTOM, fill=tk.X)


    def create_player_id_labels(self):
        # 获取窗口的宽度和高度
        
        # 下侧玩家 ID
        self.bottom_id_label = tk.Label(self.central_frame, text=f"玩家 ID: {self.player_txt_ids[0]} 本轮得分： {self.player_game_scores[0]} 总分：{self.player_scores[0]}", font=("Arial", 12))
        self.bottom_id_label.place(x=self.window_width // 2, y=self.window_height - 100, anchor=tk.CENTER)

        # 右侧玩家 ID
        self.right_id_label = tk.Label(self.central_frame, text=f"玩家 ID: {self.player_txt_ids[1]} 本轮得分： {self.player_game_scores[1]} 总分：{self.player_scores[1]}", font=("Arial", 12))
        self.right_id_label.place(x=self.window_width - 200, y=self.window_height // 2 - 100, anchor=tk.CENTER)

        # 上侧玩家 ID
        self.top_id_label = tk.Label(self.central_frame, text=f"玩家 ID: {self.player_txt_ids[2]} 本轮得分： {self.player_game_scores[2]} 总分：{self.player_scores[2]}", font=("Arial", 12))
        self.top_id_label.place(x=self.window_width // 2, y=50, anchor=tk.CENTER)

        # 左侧玩家 ID
        self.left_id_label = tk.Label(self.central_frame, text=f"玩家 ID: {self.player_txt_ids[3]} 本轮得分： {self.player_game_scores[3]} 总分：{self.player_scores[3]}", font=("Arial", 12))
        self.left_id_label.place(x=150, y=self.window_height // 2 - 100, anchor=tk.CENTER)

    def set_enable(self, enable):
        # 设置 enable 值
        self.enable = enable

    def is_valid(self): #判断玩家想出的牌是否合法
        return True
    
    def reset_played_cards(self):
        self.played_cards = [None, None, None, None]
        
    def play_card(self, index):
        if not self.is_valid():
            return
        card = self.hand[index]
        del self.hand[index]
        msg = {
            "type": "card",
            "content": card
        }
        self.send(msg)
        #self.current_turn = (self.current_turn + 1) % 4

    def next_turn(self): #逆时针轮到下一名玩家出牌
        self.current_turn = (self.current_turn + 1) % 4
        self.update_display()

    def freeze_updates(self):
        """冻结窗口更新"""
        self.root.wm_attributes('-disabled', 1)  # 禁用窗口交互
        self.root.update_idletasks()             # 处理所有待处理事件

    def unfreeze_updates(self):
        """解冻窗口更新"""
        self.root.wm_attributes('-disabled', 0)  # 启用窗口交互
        self.root.update()                       # 强制刷新窗口

    def update_display(self):
        #暂时组织窗口刷新
        self.freeze_updates()

        #判断当前能否出牌
        if self.current_turn == self.position:
            self.set_enable(True)
        else:
            self.set_enable(False)

        # 清空所有显示区域
        for frame in [self.central_frame, self.bottom_frame]:
            for widget in frame.winfo_children():
                widget.destroy()

        # 显示中央出牌区域（四个方向的牌）
        positions = ["bottom", "right", "top", "left"]
        for i, card in enumerate(self.played_cards):
            if card:
                label = tk.Label(self.central_frame, text=card, font=("Arial", 20))
                if positions[i] == "bottom":
                    label.grid(row=2, column=1, pady=(5, 0))
                elif positions[i] == "right":
                    label.grid(row=1, column=2, padx=(5, 0))
                elif positions[i] == "top":
                    label.grid(row=0, column=1, pady=(0, 5))
                elif positions[i] == "left":
                    label.grid(row=1, column=0, padx=(0, 5))
        # 添加中央网格布局配置
        self.central_frame.grid_rowconfigure(0, weight=1)
        self.central_frame.grid_rowconfigure(1, weight=1)
        self.central_frame.grid_rowconfigure(2, weight=1)
        self.central_frame.grid_columnconfigure(0, weight=1)
        self.central_frame.grid_columnconfigure(1, weight=1)
        self.central_frame.grid_columnconfigure(2, weight=1)
        for i, card in enumerate(self.hand):
            if self.enable == True:
                # 可出牌时，按钮正常显示
                button = tk.Button(self.bottom_frame, text=card, font=("Arial", 16),
                                   command=lambda index=i: self.play_card(index))
            else:
                # 不可出牌时，按钮灰色显示且不可点击
                button = tk.Button(self.bottom_frame, text=card, font=("Arial", 16), state=tk.DISABLED)
            button.pack(side=tk.LEFT, padx=2)  # 减小按钮间距以容纳更多手牌

        self.create_player_id_labels()

        #解冻窗口刷新
        self.unfreeze_updates()

def empty_func(a):
    pass

'''if __name__ == "__main__":
    play_root = tk.Tk()
    hg = HeartGame(root=play_root, send=empty_func)
    hg.set_enable(True)
    play_root.mainloop()'''